/* VERSION DEPENDENT CODE */
if (gdb_ver <= GDB_VER_2) {
- rte->rte_url = fread_cstr();
+ rte->rte_urls.AddUrlLink(UrlLink(fread_cstr()));
} else {
- rte->rte_url = gdb_fread_strlist();
+ rte->rte_urls.AddUrlLink(UrlLink(gdb_fread_strlist()));
int color_idx = FREAD_i32;
rte->line_color.bbggrr = gt_color_value(color_idx);
/* VERSION DEPENDENT CODE */
if (gdb_ver >= GDB_VER_3) {
- res->rte_url = gdb_fread_strlist();
+ res->rte_urls.AddUrlLink(UrlLink(gdb_fread_strlist()));
} else { /* if (gdb_ver <= GDB_VER_2) */
- res->rte_url = FREAD_CSTR_AS_QSTR;
+ res->rte_urls.AddUrlLink(UrlLink(FREAD_CSTR_AS_QSTR));
}
#if GDB_DEBUG
DBG(GDB_DBG_TRK, !res->rte_url.isNull())
}
FWRITE_CSTR(descr);
} else { /* if (gdb_ver > GDB_VER_3) */
- int cnt;
// url_link* url_next;
// const char* str;
QString str;
FWRITE_CSTR(str); /* instruction */
#endif
- cnt = 0;
- cnt += wpt->url_link_list_.size();
- FWRITE_i32(cnt);
- foreach(UrlLink l, wpt->GetUrlLinks()) {
+ FWRITE_i32(wpt->urls.size());
+ foreach(UrlLink l, wpt->urls) {
FWRITE_CSTR(l.url_);
}
}
/* VERSION DEPENDENT CODE */
if (gdb_ver <= GDB_VER_2) {
- FWRITE_CSTR(rte->rte_url);
+ if (rte->rte_urls.HasUrlLink()) {
+ FWRITE_CSTR(rte->rte_urls.GetUrlLink().url_);
+ } else {
+ FWRITE_CSTR("");
+ }
} else { /* if (gdb_ver >= GDB_VER_3) */
- FWRITE_CSTR_LIST(rte->rte_url);
+ if (rte->rte_urls.HasUrlLink()) {
+ FWRITE_CSTR_LIST(rte->rte_urls.GetUrlLink().url_);
+ } else {
+ FWRITE_CSTR_LIST("");
+ }
/* "Magenta" (14) is MapSource default */
FWRITE_i32((rte->line_color.bbggrr < 0) ? 14 : gt_color_index_by_rgb(rte->line_color.bbggrr));
FWRITE_C(0);
/* VERSION DEPENDENT CODE */
if (gdb_ver <= GDB_VER_2) {
- FWRITE_CSTR(trk->rte_url);
+ if (trk->rte_urls.HasUrlLink()) {
+ FWRITE_CSTR(trk->rte_urls.GetUrlLink().url_);
+ } else {
+ FWRITE_CSTR("");
+ }
} else { /* if (gdb_ver >= GDB_VER_3 */
- FWRITE_CSTR_LIST(trk->rte_url);
+ if (trk->rte_urls.HasUrlLink()) {
+ FWRITE_CSTR_LIST(trk->rte_urls.GetUrlLink().url_);
+ } else {
+ FWRITE_CSTR_LIST("");
+ }
}
}
static Waypoint* wpt_tmp;
static UrlLink* link_;
+static UrlLink* rh_link_;
static bool cache_descr_is_html;
static gpsbabel::File* iqfile;
static gpsbabel::File* oqfile;
tt_rte_name,
tt_rte_desc,
tt_rte_cmt,
+ tt_rte_url, /* Not in GPX 1.1 */
+ tt_rte_urlname, /* Not in GPX 1.1 */
+ tt_rte_link, /* New in GPX 1.1 */
+ tt_rte_link_text, /* New in GPX 1.1 */
+ tt_rte_link_type, /* New in GPX 1.1 */
tt_rte_number,
tt_garmin_rte_display_color,
tt_rte_rtept,
tt_trk_desc,
tt_trk_name,
tt_trk_trkseg,
+ tt_trk_url, /* Not in GPX 1.1 */
+ tt_trk_urlname, /* Not in GPX 1.1 */
+ tt_trk_link, /* New in GPX 1.1 */
+ tt_trk_link_text, /* New in GPX 1.1 */
+ tt_trk_link_type, /* New in GPX 1.1 */
tt_trk_number,
tt_garmin_trk_display_color,
tt_trk_trkseg_trkpt,
QStringList url;
QStringList urlname;
QStringList keywords;
- QList<UrlLink> link;
+ UrlList link;
/* time and bounds aren't here; they're recomputed. */
};
static GpxGlobal* gpx_global = nullptr;
{ tt_rte, 0, "/gpx/rte" },
{ tt_rte_name, 0, "/gpx/rte/name" },
{ tt_rte_desc, 0, "/gpx/rte/desc" },
+ { tt_rte_url, 0, "/gpx/rte/url"}, /* GPX 1.0 */
+ { tt_rte_urlname, 0, "/gpx/rte/urlname"}, /* GPX 1.0 */
+ { tt_rte_link, 0, "/gpx/rte/link"}, /* GPX 1.1 */
+ { tt_rte_link_text, 0, "/gpx/rte/link/text"}, /* GPX 1.1 */
+ { tt_rte_link_type, 0, "/gpx/rte/link/type"}, /* GPX 1.1 */
{ tt_rte_number, 0, "/gpx/rte/number" },
{ tt_garmin_rte_display_color, 1, GARMIN_RTE_EXT "/gpxx:DisplayColor"},
{ tt_trk_name, 0, "/gpx/trk/name" },
{ tt_trk_desc, 0, "/gpx/trk/desc" },
{ tt_trk_trkseg, 0, "/gpx/trk/trkseg" },
+ { tt_trk_url, 0, "/gpx/trk/url"}, /* GPX 1.0 */
+ { tt_trk_urlname, 0, "/gpx/trk/urlname"}, /* GPX 1.0 */
+ { tt_trk_link, 0, "/gpx/trk/link"}, /* GPX 1.1 */
+ { tt_trk_link_text, 0, "/gpx/trk/link/text"}, /* GPX 1.1 */
+ { tt_trk_link_type, 0, "/gpx/trk/link/type"}, /* GPX 1.1 */
{ tt_trk_number, 0, "/gpx/trk/number" },
{ tt_garmin_trk_display_color, 1, GARMIN_TRK_EXT "/gpxx:DisplayColor"},
case tt_rte:
rte_head = route_head_alloc();
route_add_head(rte_head);
+ rh_link_ = new UrlLink;
fs_ptr = &rte_head->fs;
break;
case tt_rte_rtept:
case tt_trk:
trk_head = route_head_alloc();
track_add_head(trk_head);
+ rh_link_ = new UrlLink;
fs_ptr = &trk_head->fs;
break;
case tt_trk_trkseg_trkpt:
next_trkpt_is_new_seg = 0;
}
break;
+ case tt_rte_link:
+ case tt_trk_link:
+ if (attr.hasAttribute("href")) {
+ link_url = attr.value("href").toString();
+ }
+ break;
case tt_unknown:
start_something_else(el, attr);
return;
gpx_add_to_global(gpx_global->keywords, cdatastr);
break;
case tt_link:
- (gpx_global->link).push_back(UrlLink(link_url, link_text, link_type));
+ (gpx_global->link).AddUrlLink(UrlLink(link_url, link_text, link_type));
link_type.clear();
link_text.clear();
link_url.clear();
break;
+ case tt_link_text:
+ link_text = cdatastr;
+ break;
+ case tt_link_type:
+ link_type = cdatastr;
+ break;
/*
* Waypoint-specific tags.
rte_head->rte_name = cdatastr;
break;
case tt_rte:
+ if (rh_link_) {
+ if (!rh_link_->url_.isEmpty()) {
+ rte_head->rte_urls.AddUrlLink(*rh_link_);
+ }
+ delete rh_link_;
+ rh_link_ = nullptr;
+ }
break;
case tt_rte_rtept:
if (link_) {
case tt_garmin_rte_display_color:
rte_head->line_color.bbggrr = gt_color_value_by_name(cdatastr);
break;
+ case tt_rte_link:
+ rte_head->rte_urls.AddUrlLink(UrlLink(link_url, link_text, link_type));
+ link_type.clear();
+ link_text.clear();
+ link_url.clear();
+ break;
case tt_rte_number:
rte_head->rte_num = cdatastr.toInt();
break;
trk_head->rte_name = cdatastr;
break;
case tt_trk:
+ if (rh_link_) {
+ if (!rh_link_->url_.isEmpty()) {
+ trk_head->rte_urls.AddUrlLink(*rh_link_);
+ }
+ delete rh_link_;
+ rh_link_ = nullptr;
+ }
break;
case tt_trk_trkseg:
next_trkpt_is_new_seg = 1;
case tt_garmin_trk_display_color:
trk_head->line_color.bbggrr = gt_color_value_by_name(cdatastr);
break;
+ case tt_trk_link:
+ trk_head->rte_urls.AddUrlLink(UrlLink(link_url, link_text, link_type));
+ link_type.clear();
+ link_text.clear();
+ link_url.clear();
+ break;
case tt_trk_number:
trk_head->rte_num = cdatastr.toInt();
break;
/*
* Items that are actually in multiple categories.
*/
+ case tt_rte_url:
+ case tt_trk_url:
+ rh_link_->url_ = cdatastr;
+ break;
+ case tt_rte_urlname:
+ case tt_trk_urlname:
+ rh_link_->url_link_text_ = cdatastr;
+ break;
+ case tt_rte_link_text:
+ case tt_trk_link_text:
+ link_text = cdatastr;
+ break;
+ case tt_rte_link_type:
+ case tt_trk_link_type:
+ link_type = cdatastr;
+ break;
case tt_wpttype_ele:
wpt_tmp->altitude = cdatastr.toDouble();
break;
case tt_wpttype_link_type:
link_type = cdatastr;
break;
- case tt_link_text:
- link_text = cdatastr;
- break;
- case tt_link_type:
- link_type = cdatastr;
- break;
case tt_unknown:
end_something_else();
return;
/*
* Handle the grossness of GPX 1.0 vs. 1.1 handling of linky links.
*/
+static void
+write_gpx_url(const UrlList& urls)
+{
+ if (gpx_wversion_num > 10) {
+ for (const auto& l : urls) {
+ if (!l.url_.isEmpty()) {
+ writer->writeStartElement(QStringLiteral("link"));
+ writer->writeAttribute(QStringLiteral("href"), l.url_);
+ writer->writeOptionalTextElement(QStringLiteral("text"), l.url_link_text_);
+ writer->writeOptionalTextElement(QStringLiteral("type"), l.url_link_type_);
+ writer->writeEndElement();
+ }
+ }
+ } else {
+ UrlLink l = urls.GetUrlLink();
+ if (!l.url_.isEmpty()) {
+ writer->writeTextElement(QStringLiteral("url"), QString(urlbase) + l.url_);
+ writer->writeOptionalTextElement(QStringLiteral("urlname"), l.url_link_text_);
+ }
+ }
+}
+
static void
write_gpx_url(const Waypoint* waypointp)
{
- if (!waypointp->HasUrlLink()) {
- return;
+ if (waypointp->HasUrlLink()) {
+ write_gpx_url(waypointp->urls);
}
+}
- if (gpx_wversion_num > 10) {
- for (const auto& l : waypointp->GetUrlLinks()) {
- writer->writeStartElement(QStringLiteral("link"));
- writer->writeAttribute(QStringLiteral("href"), l.url_);
- writer->writeOptionalTextElement(QStringLiteral("text"), l.url_link_text_);
- writer->writeOptionalTextElement(QStringLiteral("type"), l.url_link_type_);
- writer->writeEndElement();
- }
- return;
+static void
+write_gpx_url(const route_head* rh)
+{
+ if (rh->rte_urls.HasUrlLink()) {
+ write_gpx_url(rh->rte_urls);
}
- UrlLink l = waypointp->GetUrlLink();
- writer->writeTextElement(QStringLiteral("url"), QString(urlbase) + l.url_);
- writer->writeOptionalTextElement(QStringLiteral("urlname"), l.url_link_text_);
}
/*
writer->writeStartElement(QStringLiteral("trk"));
writer->writeOptionalTextElement(QStringLiteral("name"), rte->rte_name);
writer->writeOptionalTextElement(QStringLiteral("desc"), rte->rte_desc);
+ write_gpx_url(rte);
if (rte->rte_num) {
writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
writer->writeStartElement(QStringLiteral("rte"));
writer->writeOptionalTextElement(QStringLiteral("name"), rte->rte_name);
writer->writeOptionalTextElement(QStringLiteral("desc"), rte->rte_desc);
+ write_gpx_url(rte);
if (rte->rte_num) {
writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));